/*!
 * lzbase62 v2.0.0 - LZ77(LZSS) based compression algorithm in base62 for JavaScript
 * Copyright (c) 2014-2020 polygon planet <polygon.planet.aqua@gmail.com>
 * https://github.com/polygonplanet/lzbase62
 * @license MIT
 */
!(function (t) {
	if ("object" == typeof exports && "undefined" != typeof module) module.exports = t();
	else if ("function" == typeof define && define.amd) define([], t);
	else {
		("undefined" != typeof window ? window : "undefined" != typeof global ? global : "undefined" != typeof self ? self : this).lzbase62 = t();
	}
})(function () {
	return (function i(a, s, o) {
		function l(n, t) {
			if (!s[n]) {
				if (!a[n]) {
					var e = "function" == typeof require && require;
					if (!t && e) return e(n, !0);
					if (E) return E(n, !0);
					var r = new Error("Cannot find module '" + n + "'");
					throw ((r.code = "MODULE_NOT_FOUND"), r);
				}
				var _ = (s[n] = { exports: {} });
				a[n][0].call(
					_.exports,
					function (t) {
						return l(a[n][1][t] || t);
					},
					_,
					_.exports,
					i,
					a,
					s,
					o
				);
			}
			return s[n].exports;
		}
		for (var E = "function" == typeof require && require, t = 0; t < o.length; t++) l(o[t]);
		return l;
	})(
		{
			1: [
				function (t, n, e) {
					n.exports = { version: "2.0.0" };
				},
				{},
			],
			2: [
				function (t, n, e) {
					var A = t("./config"),
						h = t("./util");
					function r(t) {
						this._init(t);
					}
					(r.prototype = {
						_init: function (t) {
							(t = t || {}), (this._data = null), (this._table = null), (this._result = null), (this._onDataCallback = t.onData), (this._onEndCallback = t.onEnd);
						},
						_createTable: function () {
							for (var t = h.createBuffer(8, A.TABLE_LENGTH), n = 0; n < A.TABLE_LENGTH; n++) t[n] = A.BASE62TABLE.charCodeAt(n);
							return t;
						},
						_onData: function (t, n) {
							var e = h.bufferToString_fast(t, n);
							this._onDataCallback ? this._onDataCallback(e) : (this._result += e);
						},
						_onEnd: function () {
							this._onEndCallback && this._onEndCallback(), (this._data = this._table = null);
						},
						_search: function () {
							var t = 2,
								n = this._data,
								e = this._offset,
								r = A.BUFFER_MAX;
							if ((this._dataLen - e < r && (r = this._dataLen - e), r < t)) return !1;
							var _,
								i,
								a,
								s,
								o,
								l = e - A.WINDOW_BUFFER_MAX,
								E = n.substring(l, e + r),
								u = e + t - 3 - l;
							do {
								if (2 === t) {
									if (((i = n.charAt(e) + n.charAt(e + 1)), !~(a = E.indexOf(i)) || u < a)) break;
								} else 3 === t ? (i += n.charAt(e + 2)) : (i = n.substr(e, t));
								if (!~(s = A.STRING_LASTINDEXOF_BUG ? n.substring(l, e + t - 1).lastIndexOf(i) : E.lastIndexOf(i, u))) break;
								_ = l + (o = s);
								do {
									if (n.charCodeAt(e + t) !== n.charCodeAt(_ + t)) break;
								} while (++t < r);
								if (a === s) {
									t++;
									break;
								}
							} while (++t < r);
							return 2 !== t && ((this._index = A.WINDOW_BUFFER_MAX - o), (this._length = t - 1), !0);
						},
						compress: function (t) {
							if (null == t || 0 === t.length) return "";
							var n,
								e = this._createTable(),
								r = h.createWindow(),
								_ = h.createBuffer(8, A.COMPRESS_CHUNK_SIZE),
								i = 0;
							(this._result = ""), (this._offset = r.length), (this._data = r + t), (this._dataLen = this._data.length), (r = t = null);
							for (var a, s, o, l, E, u = -1, f = -1; this._offset < this._dataLen; )
								this._search()
									? ((o = this._index < A.BUFFER_MAX ? ((s = this._index), 0) : ((s = this._index % A.BUFFER_MAX), (this._index - s) / A.BUFFER_MAX)),
									  2 === this._length ? ((_[i++] = e[o + A.COMPRESS_FIXED_START]), (_[i++] = e[s])) : ((_[i++] = e[o + A.COMPRESS_START]), (_[i++] = e[s]), (_[i++] = e[this._length])),
									  (this._offset += this._length),
									  ~f && (f = -1))
									: (a = this._data.charCodeAt(this._offset++)) < A.LATIN_BUFFER_MAX
									? f === (u = a < A.UNICODE_CHAR_MAX ? ((s = a), (o = 0), A.LATIN_INDEX) : (o = (a - (s = a % A.UNICODE_CHAR_MAX)) / A.UNICODE_CHAR_MAX) + A.LATIN_INDEX)
										? (_[i++] = e[s])
										: ((_[i++] = e[u - A.LATIN_INDEX_START]), (_[i++] = e[s]), (f = u))
									: ((u = a < A.UNICODE_BUFFER_MAX ? ((s = a), (o = 0), A.UNICODE_INDEX) : (o = (a - (s = a % A.UNICODE_BUFFER_MAX)) / A.UNICODE_BUFFER_MAX) + A.UNICODE_INDEX),
									  (E = s < A.UNICODE_CHAR_MAX ? ((l = s), 0) : (s - (l = s % A.UNICODE_CHAR_MAX)) / A.UNICODE_CHAR_MAX),
									  f === u ? ((_[i++] = e[l]), (_[i++] = e[E])) : ((_[i++] = e[A.CHAR_START]), (_[i++] = e[u - A.TABLE_LENGTH]), (_[i++] = e[l]), (_[i++] = e[E]), (f = u))),
									i >= A.COMPRESS_CHUNK_MAX && (this._onData(_, i), (i = 0));
							return 0 < i && this._onData(_, i), this._onEnd(), (n = this._result), (this._result = null) === n ? "" : n;
						},
					}),
						(n.exports = r);
				},
				{ "./config": 3, "./util": 6 },
			],
			3: [
				function (t, n, e) {
					var r = (e.HAS_TYPED = "undefined" != typeof Uint8Array && "undefined" != typeof Uint16Array),
						_ = !1,
						i = !1;
					try {
						"a" === String.fromCharCode.apply(null, [97]) && (_ = !0);
					} catch (t) {}
					if (r)
						try {
							"a" === String.fromCharCode.apply(null, new Uint8Array([97])) && (i = !0);
						} catch (t) {}
					(e.CAN_CHARCODE_APPLY = _), (e.CAN_CHARCODE_APPLY_TYPED = i);
					var a = (e.APPLY_BUFFER_SIZE = 65533);
					e.APPLY_BUFFER_SIZE_OK = null;
					var s = !1;
					-1 !== "abc\u307b\u3052".lastIndexOf("\u307b\u3052", 1) && (s = !0), (e.STRING_LASTINDEXOF_BUG = s);
					var o = (e.BASE62TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"),
						l = (e.TABLE_LENGTH = o.length),
						E = Math.max(l, 62) - Math.min(l, 62);
					e.BUFFER_MAX = l - 1;
					var u = (e.WINDOW_MAX = 1024);
					e.WINDOW_BUFFER_MAX = 304;
					var f = (e.COMPRESS_CHUNK_SIZE = a);
					e.COMPRESS_CHUNK_MAX = f - l;
					var A = (e.DECOMPRESS_CHUNK_SIZE = a);
					e.DECOMPRESS_CHUNK_MAX = A + 2 * u;
					e.LATIN_BUFFER_MAX = 132;
					var h = (e.UNICODE_CHAR_MAX = 40);
					(e.UNICODE_BUFFER_MAX = h * (1 + h)), (e.LATIN_INDEX = l + 1), (e.LATIN_INDEX_START = 20 + E), (e.UNICODE_INDEX = l + 5), (e.DECODE_MAX = l - E - 19);
					var c = (e.LATIN_DECODE_MAX = 7 + h),
						C = (e.CHAR_START = 1 + c),
						S = (e.COMPRESS_START = 1 + C),
						D = (e.COMPRESS_FIXED_START = 5 + S);
					e.COMPRESS_INDEX = 5 + D;
				},
				{},
			],
			4: [
				function (t, n, e) {
					var C = t("./config"),
						S = t("./util");
					function r(t) {
						this._init(t);
					}
					(r.prototype = {
						_init: function (t) {
							(t = t || {}), (this._result = null), (this._onDataCallback = t.onData), (this._onEndCallback = t.onEnd);
						},
						_createTable: function () {
							for (var t = {}, n = 0; n < C.TABLE_LENGTH; n++) t[C.BASE62TABLE.charAt(n)] = n;
							return t;
						},
						_onData: function (t) {
							var n;
							if (this._onDataCallback) {
								if (t) (n = this._result), (this._result = []);
								else {
									var e = C.DECOMPRESS_CHUNK_SIZE - C.WINDOW_MAX;
									(n = this._result.slice(C.WINDOW_MAX, C.WINDOW_MAX + e)), (this._result = this._result.slice(0, C.WINDOW_MAX).concat(this._result.slice(C.WINDOW_MAX + e)));
								}
								0 < n.length && this._onDataCallback(S.bufferToString_fast(n));
							}
						},
						_onEnd: function () {
							this._onEndCallback && this._onEndCallback();
						},
						decompress: function (t) {
							if (null == t || 0 === t.length) return "";
							this._result = S.stringToArray(S.createWindow());
							for (var n, e, r, _, i, a, s, o, l, E, u = this._createTable(), f = !1, A = null, h = t.length, c = 0; c < h; c++)
								if (void 0 !== (r = u[t.charAt(c)])) {
									if (r < C.DECODE_MAX) (i = f ? u[t.charAt(++c)] * C.UNICODE_CHAR_MAX + r + C.UNICODE_BUFFER_MAX * A : A * C.UNICODE_CHAR_MAX + r), (this._result[this._result.length] = i);
									else if (r < C.LATIN_DECODE_MAX) (A = r - C.DECODE_MAX), (f = !1);
									else if (r === C.CHAR_START) (A = (_ = u[t.charAt(++c)]) - 5), (f = !0);
									else if (r < C.COMPRESS_INDEX) {
										if (
											((_ = u[t.charAt(++c)]),
											(s = r < C.COMPRESS_FIXED_START ? ((a = (r - C.COMPRESS_START) * C.BUFFER_MAX + _), u[t.charAt(++c)]) : ((a = (r - C.COMPRESS_FIXED_START) * C.BUFFER_MAX + _), 2)),
											(o = this._result.slice(-a)).length > s && (o.length = s),
											(l = o.length),
											0 < o.length)
										)
											for (E = 0; E < s; ) for (e = 0; e < l && ((this._result[this._result.length] = o[e]), !(++E >= s)); e++);
										A = null;
									}
									this._result.length >= C.DECOMPRESS_CHUNK_MAX && this._onData();
								}
							return (this._result = this._result.slice(C.WINDOW_MAX)), this._onData(!0), this._onEnd(), (n = S.bufferToString_fast(this._result)), (this._result = null), n;
						},
					}),
						(n.exports = r);
				},
				{ "./config": 3, "./util": 6 },
			],
			5: [
				function (t, n, e) {
					var r = t("./compressor"),
						_ = t("./decompressor");
					(e.version = t("../package.json").version),
						(e.compress = function (t, n) {
							return new r(n).compress(t);
						}),
						(e.decompress = function (t, n) {
							return new _(n).decompress(t);
						});
				},
				{ "../package.json": 1, "./compressor": 2, "./decompressor": 4 },
			],
			6: [
				function (t, n, e) {
					var i = t("./config"),
						a = String.fromCharCode;
					e.createBuffer = function (t, n) {
						if (!i.HAS_TYPED) return new Array(n);
						switch (t) {
							case 8:
								return new Uint8Array(n);
							case 16:
								return new Uint16Array(n);
						}
					};
					var _ = (e.truncateBuffer = function (t, n) {
						return t.length === n ? t : t.subarray ? t.subarray(0, n) : ((t.length = n), t);
					});
					e.bufferToString_fast = function (t, n) {
						if ((null == n ? (n = t.length) : (t = _(t, n)), i.CAN_CHARCODE_APPLY && i.CAN_CHARCODE_APPLY_TYPED)) {
							var e = t.length;
							if (e < i.APPLY_BUFFER_SIZE && i.APPLY_BUFFER_SIZE_OK) return a.apply(null, t);
							if (null === i.APPLY_BUFFER_SIZE_OK)
								try {
									var r = a.apply(null, t);
									return e > i.APPLY_BUFFER_SIZE && (i.APPLY_BUFFER_SIZE_OK = !0), r;
								} catch (t) {
									i.APPLY_BUFFER_SIZE_OK = !1;
								}
						}
						return s(t);
					};
					var s = (e.bufferToString_chunked = function (t) {
							for (var n, e = "", r = t.length, _ = 0; _ < r; ) {
								if (((n = t.subarray ? t.subarray(_, _ + i.APPLY_BUFFER_SIZE) : t.slice(_, _ + i.APPLY_BUFFER_SIZE)), (_ += i.APPLY_BUFFER_SIZE), !i.APPLY_BUFFER_SIZE_OK)) {
									if (null === i.APPLY_BUFFER_SIZE_OK)
										try {
											(e += a.apply(null, n)), n.length > i.APPLY_BUFFER_SIZE && (i.APPLY_BUFFER_SIZE_OK = !0);
											continue;
										} catch (t) {
											i.APPLY_BUFFER_SIZE_OK = !1;
										}
									return o(t);
								}
								e += a.apply(null, n);
							}
							return e;
						}),
						o = (e.bufferToString_slow = function (t) {
							for (var n = "", e = t.length, r = 0; r < e; r++) n += a(t[r]);
							return n;
						});
					(e.stringToArray = function (t) {
						for (var n = [], e = t && t.length, r = 0; r < e; r++) n[r] = t.charCodeAt(r);
						return n;
					}),
						(e.createWindow = function () {
							for (var t = 8, n = "        "; !(1024 & t); ) (n += n), (t <<= 1);
							return n;
						});
				},
				{ "./config": 3 },
			],
		},
		{},
		[5]
	)(5);
});
/**
 * BEGIN settings.js
 */
if (!window.base64Decode) {
	window.base64Decode = function (str) {
		try {
			return decodeURIComponent(
				Array.prototype.map
					.call(atob(str), function (c) {
						return "%" + ("00" + c.charCodeAt(0).toString(16)).slice(-2);
					})
					.join("")
			);
		} catch (ex) {
			return atob(str);
		}
	};
}
if (!window.base64Encode) {
	window.base64Encode = function (str) {
		try {
			return btoa(
				encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, function (match, p1) {
					return String.fromCharCode(parseInt(p1, 16));
				})
			);
		} catch (ex) {
			return btoa(str);
		}
	};
}
function isBase64(str) {
	try {
		return base64Encode(base64Decode(str)) == str;
	} catch (err) {
		return false;
	}
}
if (!window.getCookie) {
	window.getCookie = function (name) {
		var nameEQ = name + "=";
		var ca = document.cookie.split(";");
		for (var i = 0; i < ca.length; i++) {
			var c = ca[i];
			while (c.charAt(0) == " ") c = c.substring(1, c.length);
			if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length);
		}
		return null;
	};
}
if (!window.setCookie) {
	window.setCookie = function (name, value, days) {
		var expires = "";
		if (days) {
			var date = new Date();
			date.setTime(date.getTime() + days * 24 * 60 * 60 * 1000);
			expires = "; expires=" + date.toUTCString();
		}
		var val = value;
		if (value == null) {
			val = "null";
		} else if (typeof value != "string") {
			val = value.toString();
		}
		document.cookie = name + "=" + (val || "") + expires + "; SameSite=Lax; path=/";
	};
}
if (!window.eraseCookie) {
	window.eraseCookie = function (name) {
		document.cookie = name + "=; Max-Age=-99999999;";
	};
}
function isJson(obj) {
	const __t = typeof obj;
	return obj !== null && obj !== undefined && ["boolean", "number", "string", "symbol", "function"].indexOf(__t) == -1;
}
const Settings = {
	hasStorage: function () {
		return typeof Storage === "function" || typeof Storage === "object";
	},
	load: function (name) {
		return this.load(name, {});
	},
	load: function (name, options) {
		try {
			const disableCookies = options !== null && options !== undefined && options["disable_cookies"] && options["disable_cookies"] === true;
			if (window.getCookie(name) !== null && !disableCookies) {
				const d = window.getCookie(name);
				return JSON.parse(lzbase62.decompress(d));
			} else if (Settings.hasStorage()) {
				if (localStorage.getItem(name) !== null) {
					const de = localStorage.getItem(name);
					return JSON.parse(lzbase62.decompress(de));
				}
			}
			return null;
		} catch (e) {
			console.error(e);
			return null;
		}
	},
	save: function (name, object) {
		return this.save(name, object, {});
	},
	save: function (name, object, options) {
		if (object == null || name == null) {
			console.error("save(name, object) -> name/object == null!");
			return false;
		}
		if (!isJson(object)) {
			console.error("save(name, object) -> Invalid object provided!");
			return false;
		}
		try {
			const disableCookies = options !== null && options !== undefined && options["disable_cookies"] && options["disable_cookies"] === true;
			const OUTPUT = lzbase62.compress(JSON.stringify(object));
			if (disableCookies) {
			} else {
				window.setCookie(name, OUTPUT, Number.MAX_SAFE_INTEGER - 200000);
			}
			if (Settings.hasStorage()) {
				localStorage.setItem(name, OUTPUT);
			}
			return true;
		} catch (e) {
			console.error(e);
			return false;
		}
	},
	erase: function (name) {
		if (name == null) {
			console.error("erase(name) -> name == null!");
			return false;
		}
		try {
			if (Settings.hasStorage()) {
				localStorage.removeItem(name);
			} else {
				eraseCookie(name);
			}
			return true;
		} catch (e) {
			console.error(e);
			return false;
		}
	},
	exists: function (name) {
		try {
			const y = Settings.load(name);
			if (y === null || y === undefined) {
				return false;
			}
			if (!isJson(y)) {
				return false;
			}
			return true;
		} catch (e) {
			console.error(e);
			return false;
		}
	},
};
function check_webp_feature(feature, callback) {
	var kTestImages = {
		lossy: "UklGRiIAAABXRUJQVlA4IBYAAAAwAQCdASoBAAEADsD+JaQAA3AAAAAA",
		lossless: "UklGRhoAAABXRUJQVlA4TA0AAAAvAAAAEAcQERGIiP4HAA==",
		alpha: "UklGRkoAAABXRUJQVlA4WAoAAAAQAAAAAAAAAAAAQUxQSAwAAAARBxAR/Q9ERP8DAABWUDggGAAAABQBAJ0BKgEAAQAAAP4AAA3AAP7mtQAAAA==",
		animation: "UklGRlIAAABXRUJQVlA4WAoAAAASAAAAAAAAAAAAQU5JTQYAAAD/////AABBTk1GJgAAAAAAAAAAAAAAAAAAAGQAAABWUDhMDQAAAC8AAAAQBxAREYiI/gcA",
	};
	var img = new Image();
	img.onload = function () {
		var result = img.width > 0 && img.height > 0;
		callback(feature, result);
	};
	img.onerror = function () {
		callback(feature, false);
	};
	img.src = "data:image/webp;base64," + kTestImages[feature];
}
const nTubeSettings = {
	auto: function () {
		const s = Settings.load("ntube_settings");
		function hdr_check() {
			try {
				return (!!screen && screen.colorDepth > 24) || window.matchMedia("(color-gamut: p3)").matches || window.matchMedia("(dynamic-range: high)").matches;
			} catch (e) {
				console.error("hdr_check: Failed.");
				console.error(e);
				return false;
			}
		}
		function webm_stub() {
			if (window.supportsVideoType) {
				return supportsVideoType("vp9") === "probably";
			} else {
				return true;
			}
		}
		if (s == null) {
			const n = {
				extraction: {
					defaultQuality: 720,
					allowWebM: webm_stub() /* Enabled as of 1.5-rc2 */,
					extractor: "ntube.site_extractor",
					/* FIXME: This option isn't really useful anymore, shouldn't it be removed soon enough? */
					/**
					 * extractor:
					 * Allowed Values:
					 *   - ntube.site_extractor  (Page Extractor)
					 *   - ntube.embed_extractor (Embed API Extractor)
					 */
					forceEnglishLanguage: false,
					av1_behaviour: "def",
					enable10bit: hdr_check(),
					dataSaving: "def",
					reduceQuality: false,
					lowQualityAV1Only: false,
				},
				playback: {
					behaviour: "auto",
					loopMedia: false,
					enablePlaylistNotifications: false,
					autoplayMedia: true /* Fix for beta builds not playing with nMuxer */,
					/* use_dash_js was removed in 1.5-a1-rc3. */
					/* dash_js_remove_30 is now false by default since 1.5.4 */
					dash_js_remove_30: false /* Removes 30 FPS videos if (and only if) 60 FPS videos are available. */,
					dash_js_force_quality_init: false /* Sets quality to preferred one, still allows quality switching by default */,
					/* dash_js_use_experimental_options: false, Disabled by default, Removed in 1.5.0-rc2 */
					/*
					 * Engines:
					 *  nPlayerNX
					 *  dash.js (DEPRECATED)
					 *  plyr-dash (DEPRECATED)
					 *  nMuxer (WIP)
					 *  Shaka (experimental)
					 *  Shaka+UI (experimental)
					 *  rxPlayer (default)
					 */
					playback_engine: "rxplayer",
					use_plyr_for_fallback: true,
				},
				appearance: {
					theme: "ntube2_dark",
					/**
					 * theme:
					 * Allowed Values:
					 *  - ntube2_dark       (Default Dark)
					 *  - ntube2_light      (Default Light)
					 *  - ntube_legacy_dark   (Adapted Legacy Dark)
					 *  - ntube_legacy_light  (Adapted Legacy Light)
					 *  - ntube_in_space    (Space!)
					 */
					font: "ntube2_defaults",
					/**
					 * font:
					 * Allowed Values:
					 *  - ntube2_defaults     (Default System Based)
					 *  - ntube2_next       (Based on Inter for UI and <PLACEHOLDER> for Monospace)
					 */
					subtitles: "copyish",
					/**
					 * subtitles:
					 * Allowed Values:
					 * - legacy (Old look, bordered green)
					 * - new_shadowed (New look, flat, shadowed, transparent)
					 * - new_outlined
					 * - new_tv_cc (TV/CC like look)
					 * - copyish (Totally not imitating the platform we are originally using)
					 *
					 * Unofficial: (Removed as of 1.5.0-beta-0)
					 * - new (defaults to new_outlined, if supported else new_shadowed)
					 */
					//enable_vhs_look: false, // Enables the new VHS-esque look. Removed as of 1.5-rc2. New API and look coming soon.
					enable_new_look: true,
					enable_apple_look: false,
					enable_webp: true,
					custom_css: "" /* [!] Encoded in Base 64 [!] */,
					yt_chat_enforce_dark_mode: false,
					use_newer_ui_preset: false,
					ui_use_narrow_font_spacing: false,
				},
				privacy: {
					enablePrivacyMode: false,
					useFakeCookies: false,
					emulateProxy: false,
					yt_auto_enable_live_chat: false,
				},
				nmuxer: {
					/*
					 * Uses 2MB chunks. Requires a stable and steady internet connection.
					 */
					useVeryLargeChunks: false,
				},
				global: {
					blockedChannels: [],
					subscriptions: [],
					sponsor_blocking: false,
					sponsor_block_settings: {
						mode: "skip", // Supported: skip, ping, inform
						disable_on_subscribed_channels: false,
					},
					filters: {
						/* Replaced with -ntube-custom-filter setting/cookie in 1.5.6 */
					},
					enable_clv: false,
					disable_localized_video_text: false,
					disable_cookies: false,
					qualigain_mode: "v1",
					experiments: {
						shaka_add_request_timeouts: false,
					},
				},
			};
			check_webp_feature("animation", function (feature, isSupported) {
				console.log("WebP [Animated] Support: " + isSupported + " (for: " + feature + ")");
				n.appearance.enable_webp = isSupported;
			});
			Settings.save("ntube_settings", n);
			return n;
		} else {
			if (s.global === undefined) {
				s.global = {};
			}
			if (s.global.filters === undefined) {
				s.global.filters = {};
			}
			return s;
		}
	},
	save: function (x) {
		Settings.save("ntube_settings", x);
	},
	isValidObject: function (obj) {
		if (obj === null || obj === undefined || typeof obj !== "object") {
			return false;
		}
		return obj["extraction"] && obj["playback"] && obj["appearance"] && obj["nmuxer"] && obj["privacy"] && obj["global"];
	},
};
window.nTubeSettings = nTubeSettings;
window.Settings = Settings;
